package com.eimf.saf.common.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.eimf.saf.base.util.BaseCache;
import com.eimf.saf.common.dao.DictDao;
import com.eimf.saf.common.dao.InternationDao;
import com.eimf.saf.common.entity.Dict;
import com.eimf.saf.common.service.DictService;
import com.eimf.saf.common.util.CommonCache;
import com.eimf.saf.security.exception.AppException;

/**
 * @author eden
 * @date 2013-11-13 下午6:08:48
 * @Description: 数据字典业务类
 */
@Service
public class DictServiceImpl implements DictService
{

    @Autowired
    private DictDao dictDao;

    @Autowired
    private InternationDao internationDao;

    /**
     * 查询所有数据字典
     * */
    @Override
    public List<Dict> findAllDictList()
    {
        return dictDao.findAllDictList();
    }

    /**
     * 查询指定的字典类型下所有字典数据
     * */
    @Override
    public List<Dict> findDictListByDictTypeID(final String dictTypeId)
    {
        return dictDao.findDictListByDictTypeID(dictTypeId);
    }

    /**
     * 根据字典类型id和字典代码获取该字典信息
     */
    @Override
    public Dict getDictById(final Dict dict)
    {
        return dictDao.findDictById(dict);
    }

    public String getInternationId(final HashMap<String, Object> map, final String language, final String dictName)
    {
        final String internationId = internationDao.addInternation(map) + "";
        if ("".equals(internationId) || internationId == null)
        {
            throw AppException.createErrorException("国际化更新出错！请联系管理员！");
        }
        return internationId;
    }

    /**
     * 新增数据字典。
     */
    @Override
    public void addDict(final Dict dict)
    {
        final String dictTypeId = dict.getDictTypeId().trim();
        AppException.isNull(dictTypeId, "字典类型编号");
        AppException.isNull(dict.getDictId().trim(), "字典代码ID");
        final HashMap<String, Object> map = new HashMap<String, Object>();
        final String name = dict.getDictName();
        final String language = BaseCache.getSystemParm("default_language").toUpperCase();// 语言类型
        map.put(language, name);
        // 查询国际化表是否已有记录，如果字典名称在国际化表里有对应的字段，就返回id，存入字典表，不再新增国际化表
        final Map<String, Object> has = dictDao.checkIn18(map);
        String id = "";
        if (has != null)
        {
            id = has.get("ID").toString();
        } else
        {
            id = getInternationId(map, language, name);
        }
        dict.setDictName(id);
        dictDao.addDict(dict);
        // 处理缓存中数据字典
        CommonCache.addDictMap(dictTypeId, dict);
    }

    /**
     * 修改数据字典。
     */
    @Override
    public void updDictById(final Dict dict)
    {
        final String dictTypeId = dict.getDictTypeId().trim();
        final String dictName = dict.getDictName().trim();
        // 处理基本的异常
        AppException.isNull(dictTypeId, "字典类型编号");
        AppException.isNull(dict.getDictId().trim(), "字典代码ID");
        AppException.isNull(dictName, "字典名称");
        String id = null;
        final HashMap<String, Object> hasmap = new HashMap<String, Object>();
        final String language = BaseCache.getSystemParm("default_language").toUpperCase();// 语言类型
        hasmap.put(language, dictName);
        // 查询国际化表是否已有记录,如果字典名称在国际化表里有对应的字段，就返回id，存入字典表，不再新增国际化表
        final Map<String, Object> has = dictDao.checkIn18(hasmap);
        if (has != null)
        {
            id = has.get("ID").toString();
        } else
        {
            id = getInternationId(hasmap, language, dictName);
        }
        dict.setDictName(id);
        dictDao.updDictById(dict);
        // 处理缓存中数据字典
        dict.setDictName(dictName);
        CommonCache.setDictMap(dictTypeId, dict);
    }

    /**
     * 数据字典启用/停用
     */
    @Override
    public void updDict_status(final Dict dict)
    {
        final String dictTypeId = dict.getDictTypeId().trim();
        AppException.isNull(dictTypeId, "字典类型编号");
        AppException.isNull(dict.getDictId().trim(), "字典代码ID");
        dictDao.updDict_status(dict);
        // 处理内存中数据字典
        CommonCache.setDictMap(dictTypeId, dict.getDictId(), dict.getDictKey(), dict.getStatus());
    }

    /**
     * 删除指定的数据字典。
     */
    @Override
    public void delDictById(final Dict dict)
    {
        final String dictTypeId = dict.getDictTypeId().trim();
        AppException.isNull(dictTypeId, "字典类型编号");
        AppException.isNull(dict.getDictId().trim(), "字典代码");
        dictDao.delDictById(dict);
        // 处理缓存中数据字典
        CommonCache.removeDict(dictTypeId, dict.getDictId());
    }

}
